package main

import "fmt"

//函数
/* 1.函数是一段代码的封装
   2.把一段逻辑抽象出来封装到一个函数中，给他起个名字， 函数名调用就可以了
     每次用到它的时候直接调用
   3.使用函数能够让结构更清晰，更简洁 */
func sum(x int, y int) (ret int) {
	return x + y
}

//没有返回值
func sum1(x int, y int) {
	fmt.Println(x + y)
}

//没有参数，没有返回值
func sum2() {
	fmt.Println("f2")
}

//没有参数但有返回值的
func sum3() int {
	ret := 3
	return ret
}

//返回值可以命名也可以不命名
//命名的返回值相当于在函数内声明一个变量
func sum4(x int, y int) (ret int) {
	ret = x + y
	return //使用命名返回值，可以在return后省略
}

func sum5() (int, string) {
	return 1, "沙河"
}

//参数的类型简写,当参数中连续多个参数的类型一致时，我们可以将非最后一个参数的类型省略
func sum6(x, y int, m, n string, i, j bool) int {
	return x + y
}

//可变长参数
//可变长参数必须放在函数参数的最后
func sum7(x string, y ...int) {
	fmt.Println(x)
	fmt.Println(y) //y的类型是切片   []int
}

//Go语言中函数没有默认参数这个概念

func main() {
	r := sum(10, 20)
	fmt.Println(r)
	r4 := sum4(10, 20)
	fmt.Println(r4)
	m, n := sum5()
	fmt.Println(m, n)

	sum7("下雨了")
	sum7("下雨了", 1, 2, 3, 4, 5, 6, 7)
	sum1(10, 2)
	sum3()
}
